package pl.edu.pk.psb.bc.assembler;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import pl.edu.pk.psb.bc.ds.WydarzenieDs;
import pl.edu.pk.psb.bc.dto.WydarzenieDto;
import pl.edu.pk.psb.bc.util.DataUtil;

@Component
public class WydarzenieAssembler {
	@Autowired
	AdresAssembler adresAssembler;
	
	@Autowired
	SalaAssembler salaAssembler;
	
	@Autowired
	KategoriaAssembler kategoriaAssembler;

	public WydarzenieDto konwertuj(WydarzenieDs ds) {
		WydarzenieDto dto = new WydarzenieDto();
		dto.setId(ds.getId());
		dto.setNazwa(ds.getNazwa());
		dto.setOpis(ds.getOpis());
		dto.setData(ds.getData());
		dto.setDataSformatowana(DataUtil.wypiszDate(dto.getData()));
		dto.setAdres(adresAssembler.konwertuj(ds.getAdres()));
		dto.setDataDodania(ds.getDataDodania());
		dto.setCenaNormalna(ds.getCenaNormalna());
		dto.setCenaUlgowa(ds.getCenaUlgowa());
		dto.setKategoria(kategoriaAssembler.konwertuj(ds.getKategoria()));
		dto.setSciezkaObrazu(ds.getSciezkaObrazu());
		if(ds.getIloscMiejsc() != null && ds.getIloscRzedow() != null){
			//wydarzenie z sala
			dto.setSala(salaAssembler.konwertujDoSali(ds.getMiejsca(), ds.getIloscRzedow(), ds.getIloscMiejsc()));
		}else if(ds.getDostepnychMiejsc() != null && ds.getWszystkichMiejsc() != null){
			//wydarzenie bez sali
			dto.setDostepnychMiejsc(ds.getDostepnychMiejsc());
			dto.setWszystkichMiejsc(ds.getWszystkichMiejsc());
		}else{
			throw new IllegalArgumentException("Podane wydarzenie jest niepoprawne");
		}
		
		return dto;
	}

	public WydarzenieDs konwertuj(WydarzenieDto dto) {
		WydarzenieDs ds = new WydarzenieDs();
		ds.setId(dto.getId());
		ds.setSciezkaObrazu(dto.getSciezkaObrazu());
		ds.setNazwa(dto.getNazwa());
		ds.setOpis(dto.getOpis());
		ds.setData(dto.getData());
		ds.setAdres(adresAssembler.konwertuj(dto.getAdres()));
		ds.setDataDodania(dto.getDataDodania());
		ds.setCenaNormalna(dto.getCenaNormalna());
		ds.setCenaUlgowa(dto.getCenaUlgowa());
		ds.setKategoria(kategoriaAssembler.konwertuj(dto.getKategoria()));
		if(dto.getSala() != null){
			ds.setIloscRzedow(dto.getSala().getIloscRzedow());
			ds.setIloscMiejsc(dto.getSala().getIloscMiejscWRzedzie());
			ds.setMiejsca(salaAssembler.konwertujDoZbioruDs(dto.getSala()));
		}else if(dto.getWszystkichMiejsc() != null && dto.getDostepnychMiejsc() != null){
			ds.setWszystkichMiejsc(dto.getWszystkichMiejsc());
			ds.setDostepnychMiejsc(dto.getDostepnychMiejsc());
		}else{
			throw new IllegalArgumentException("Podane wydarzenie jest niepoprawne");
		}
		
		return ds;
	}

	public List<WydarzenieDto> konwertujDoDto(List<WydarzenieDs> ds) {
		List<WydarzenieDto> dto = new ArrayList<WydarzenieDto>();
		for (WydarzenieDs wydarzenie : ds) {
			dto.add(konwertuj(wydarzenie));
		}
		return dto;
	}

	public List<WydarzenieDs> konwertujDoDs(List<WydarzenieDto> dto) {
		List<WydarzenieDs> ds = new ArrayList<WydarzenieDs>();
		for (WydarzenieDto wydarzenie : dto) {
			ds.add(konwertuj(wydarzenie));
		}
		return ds;
	}
}
